package com.tool.xmltool;

import com.tool.xmltool.cache.XmlConfigCache;
import com.tool.xmltool.entry.XmlMessage;
import com.tool.xmltool.handler.XmlPackHandler;
import com.tool.xmltool.handler.XmlUnPackHandler;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.Map;

/**
 * xml和map相互转换的工具类
 * @author zhoubin
 */
@Slf4j
public class XmlUtil {

    private static XmlConfigCache xmlConfigCache = new XmlConfigCache();

    /**
     * xml报文转为XmlMessage报文类
     * @param msg xml完整报文
     * @param xmlType xml类型
     * @return
     */
    public static XmlMessage xml2XmlObj(String msg, String xmlType) {

        return xml2XmlObj(msg, xmlType, false);
    }

    /**
     * xml报文转为XmlMessage报文类
     * @param msg xml完整报文
     * @param xmlType xml类型
     * @param checkNode 是否校验
     * @return
     */
    public static XmlMessage xml2XmlObj(String msg, String xmlType, boolean checkNode) {

        XmlUnPackHandler unPackHandler = new XmlUnPackHandler(xmlConfigCache.getConfigStore(xmlType));
        unPackHandler.initData(msg, checkNode);
        return unPackHandler.parseXml();
    }

    /**
     * 报文组包
     * @param bodyMap xmlMap对象
     * @param msgType xml类型
     * @param docXmlns xml的命名空间
     * @return xml报文
     * @throws IOException
     */
    public static String map2Xml(Map<String, Object> bodyMap, String msgType, String docXmlns) {

        XmlPackHandler xmlPack = new XmlPackHandler(xmlConfigCache.getConfigStore(msgType));
        xmlPack.initData(bodyMap, docXmlns);
        try {
            xmlPack.map2Xml();
        } catch (IOException e) {
            log.error("map转xml失败");
            return null;
        }
        return xmlPack.getMsg();
    }
}
